Taller reducción de dimensionalidad
-----------------------------------
`Datos de la NASA `__
- TS: Temperatura. Earth Skin Temperature
- RH2M: Humedad relativa 2m
- WS50M: Viento 50m
- PRECTOTCORR: Precipitación promedio
- ALLSKY_SFC_SW_DWN: Irradiancia
.. code:: ipython3
import json
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# Cargar el archivo JSON
with open("POWER_Point_Monthly_19810101_20221231_006d24N_075d58W_UTC.json", "r") as file:
data = json.load(file)
# Extraer las variables principales
properties = data["properties"]
# Extraer las seis variables
variables = properties["parameter"]
# Crear un DataFrame con las variables extraídas
df = pd.DataFrame(variables)
df.head()
.. raw:: html
|
TS |
RH2M |
WS50M |
PRECTOTCORR_SUM |
ALLSKY_SFC_SW_DWN |
198101 |
16.38 |
88.00 |
1.39 |
100.20 |
-999.0 |
198102 |
16.79 |
89.31 |
1.34 |
195.12 |
-999.0 |
198103 |
17.50 |
88.06 |
1.24 |
295.31 |
-999.0 |
198104 |
17.27 |
90.44 |
1.42 |
358.59 |
-999.0 |
198105 |
16.90 |
92.88 |
1.31 |
411.33 |
-999.0 |
.. code:: ipython3
# Renombrar las variables en el DataFrame
df.rename(
columns={
"TS": "Temperatura",
"RH2M": "Humedad relativa 2m",
"WS50M": "Viento 50m",
"PRECTOTCORR_SUM": "Precipitación",
"ALLSKY_SFC_SW_DWN": "Irradiancia",
},
inplace=True,
)
df.head()
.. raw:: html
|
Temperatura |
Humedad relativa 2m |
Viento 50m |
Precipitación |
Irradiancia |
198101 |
16.38 |
88.00 |
1.39 |
100.20 |
-999.0 |
198102 |
16.79 |
89.31 |
1.34 |
195.12 |
-999.0 |
198103 |
17.50 |
88.06 |
1.24 |
295.31 |
-999.0 |
198104 |
17.27 |
90.44 |
1.42 |
358.59 |
-999.0 |
198105 |
16.90 |
92.88 |
1.31 |
411.33 |
-999.0 |
.. code:: ipython3
# Convertir el índice a formato de texto para filtrar filas
df.index = df.index.astype(str)
# Filtrar filas cuyo índice no termine en '13'
df = df[~df.index.str.endswith("13")]
# Convertir el índice de vuelta a formato de fecha y cambiar el formato a año/mes
df.index = pd.to_datetime(df.index, format="%Y%m").strftime("%Y/%m")
df.head()
.. raw:: html
|
Temperatura |
Humedad relativa 2m |
Viento 50m |
Precipitación |
Irradiancia |
1981/01 |
16.38 |
88.00 |
1.39 |
100.20 |
-999.0 |
1981/02 |
16.79 |
89.31 |
1.34 |
195.12 |
-999.0 |
1981/03 |
17.50 |
88.06 |
1.24 |
295.31 |
-999.0 |
1981/04 |
17.27 |
90.44 |
1.42 |
358.59 |
-999.0 |
1981/05 |
16.90 |
92.88 |
1.31 |
411.33 |
-999.0 |
.. code:: ipython3
# Contar el total de datos por variable
total_counts = df.count()
print(total_counts)
# Verificar si hay datos faltantes (NaN) y contarlos
nan_counts = df.isna().sum()
print(nan_counts)
.. parsed-literal::
Temperatura 504
Humedad relativa 2m 504
Viento 50m 504
Precipitación 504
Irradiancia 504
dtype: int64
Temperatura 0
Humedad relativa 2m 0
Viento 50m 0
Precipitación 0
Irradiancia 0
dtype: int64
.. code:: ipython3
# Realizar el análisis descriptivo de las variables
descriptive_analysis = df.describe()
# Mostrar el análisis descriptivo
print(descriptive_analysis)
.. parsed-literal::
Temperatura Humedad relativa 2m Viento 50m Precipitación \
count 504.000000 504.000000 504.000000 504.000000
mean 17.267044 88.761171 1.468512 223.256766
std 0.613532 2.608982 0.172959 96.200608
min 15.810000 74.750000 1.020000 5.270000
25% 16.837500 87.620000 1.360000 152.930000
50% 17.225000 89.250000 1.440000 221.480000
75% 17.650000 90.440000 1.570000 295.310000
max 19.970000 94.250000 2.040000 479.880000
Irradiancia
count 504.000000
mean -66.716389
std 258.826222
min -999.000000
25% 4.580000
50% 4.910000
75% 5.292500
max 6.200000
.. code:: ipython3
# Eliminar filas donde cualquier variable tenga el valor -999.000000
df = df[(df != -999.000000).all(axis=1)]
# Realizar el análisis descriptivo de las variables
descriptive_analysis = df.describe()
# Mostrar el análisis descriptivo
print(descriptive_analysis)
.. parsed-literal::
Temperatura Humedad relativa 2m Viento 50m Precipitación \
count 468.000000 468.000000 468.000000 468.000000
mean 17.290021 88.680705 1.471368 220.125491
std 0.611990 2.644085 0.171126 96.169838
min 15.810000 74.750000 1.020000 5.270000
25% 16.870000 87.605000 1.360000 147.660000
50% 17.250000 89.190000 1.450000 216.210000
75% 17.660000 90.395000 1.572500 295.310000
max 19.970000 94.250000 2.040000 479.880000
Irradiancia
count 468.000000
mean 4.997735
std 0.455511
min 4.060000
25% 4.657500
50% 4.970000
75% 5.332500
max 6.200000
.. code:: ipython3
# Crear un gráfico por cada variable en subplots
variables = [
"Temperatura",
"Humedad relativa 2m",
"Viento 50m",
"Precipitación",
"Irradiancia",
]
plt.figure(figsize=(15, 20))
for i, var in enumerate(variables, 1):
plt.subplot(6, 1, i)
plt.plot(df[var], label=var)
plt.title(var)
plt.xlabel("Fecha")
plt.ylabel(var)
plt.xticks(rotation=45)
plt.legend()
# Ajustar la frecuencia de las etiquetas en el eje x
if len(df) > 0:
plt.xticks(
ticks=range(0, len(df.index), len(df.index) // 50),
labels=df.index[:: len(df.index) // 50],
)
plt.tight_layout(pad=3.0)
plt.show()
.. image:: output_9_0.png